<?php
// +----------------------------------------------------------------------
// | 幕小铺
// +----------------------------------------------------------------------
// | 版权所有 2016~2020 幕小铺科技（大连）有限公司
// +----------------------------------------------------------------------
// | 2020/06/10
// +----------------------------------------------------------------------

namespace app\erp\home;
use app\common\controller\AuthCheck;
use think\Db;

/**
 * 调拨管理
 * @package app\cms\admin
 */
class Allocation extends AuthCheck{
    /**
     * 首页
     * @author dou<51779987@qq.com>
     * @return json_out(code, message, data)
     */
    public function list(){
        //参数接收
        $params 		    = $this->getParams(0);//0 get 1 post
        $user_id    	    = intval(isset($params["user_id"]) ? $params["user_id"] : 0);//操作用户ID
        $from_warehouse_id  = isset($params["from_warehouse_id"]) ? $params["from_warehouse_id"] : 0;//调出仓id
        $to_warehouse_id    = isset($params["to_warehouse_id"]) ? $params["to_warehouse_id"] : 0;//调入仓id
        $handled_by    	    = isset($params["handled_by"]) ? $params["handled_by"] : '';//经办人
        $code    	        = isset($params["code"]) ? $params["code"] : '';//调拨单号
        $all_status    	    = intval(isset($params["all_status"]) ? $params["all_status"] : 0);//调拨单状态

        //数据验证
        $Validate = validate('Allocation', 'validate');
        if( !$Validate -> scene('allocation_list') -> check($params) ){
            json_out(-1001, $Validate -> getError(), []);//验证失败
        }
        //逻辑处理
        $list = controller('Allocationlogic', 'logic') -> index($user_id, $code, $from_warehouse_id, $to_warehouse_id, $handled_by, $all_status);

        //数据返回
        if($list['code'] == 200){
            json_out($list['code'], $list['message'], $list['data']);
        }else{
            json_out($list['code'], $list['message'], []);
        }
    }

    /**
     * 添加
     * @param uid 	                    int         操作人
     * @param from_warehouse_id 		int         调出仓
     * @param to_warehouse_id 		    int
     * @param remarks 		            string      备注
     * @param handled_by 		        string      经办人
     * @param code 		                string      调拨单号
     * @param sku_id 		            int         单品id
     * @param num 		                int         单品数量
     * @param all_status 		        int         状态
     * @author dou<51779987@qq.com>
     * @return json_out(code, message, (int)id)
     */
    public function add(){
        //参数接收
        $params 		    = $this->getParams(1);//0 get 1 post
        //测试数据
        /*$params["sku"] = [
            ['sku_id'=>'15','num'=>'1'],
        ];*/
        $user_id    	    = intval(isset($params["user_id"]) ? $params["user_id"] : 0);//操作用户ID
        $from_warehouse_id  = intval(isset($params["from_warehouse_id"]) ? $params["from_warehouse_id"] : 0);//操作用户ID
        $to_warehouse_id    = intval(isset($params["to_warehouse_id"]) ? $params["to_warehouse_id"] : 0);//操作用户ID
        $remark    	        = isset($params["remark"]) ? $params["remark"] : '';
        $handled_by    	    = isset($params["handled_by"]) ? $params["handled_by"] : '';//经办人
        //$code    		    = isset($params["code"]) ? $params["code"] : '';
        $sku                = isset($params["sku"]) ? $params["sku"] : '';
        //获取调拨单号code
        $code_count = model('ErpAllocation') ->count();
        $code = $params['code'] = 'A'.date('Ymd').(str_pad(($code_count+1),3,"0",STR_PAD_LEFT));

        //数据验证
        $Validate = validate('Allocation', 'validate');
        if( !$Validate -> scene('allocation_add') -> check($params) ){
            json_out(-1001, $Validate -> getError());//验证失败
        }

        //插入之前排查sku数量是否符合
        foreach ($sku as $k_sku => $v_sku) {
            $ishave = $this->checkHave($v_sku['sku_id'], $v_sku['num']);
            if($ishave['code'] < 0){
                json_out(-1001, $ishave['message']);//验证失败
            }elseif($ishave['code'] == 200 && $ishave['data'] == '2'){
                json_out(-1001, '货物超出库存数量请仔细核对库存');//验证失败
            }
        }

        //逻辑处理
        $list = controller('Allocationlogic', 'logic') -> add($user_id, $from_warehouse_id, $to_warehouse_id, $remark, $handled_by, $code, $sku);
        //数据返回
        if($list['code'] == 200){
            json_out($list['code'], '新增成功');
        }else{
            json_out($list['code'], $list['message']);
        }
    }


    //验证库存是否满足转出数量
    public function checkHave($sku_id,$num=false)
    {
        if($sku_id){
            $ishave = model('ErpGoodsWarehouseStockNum') -> where(['sku_id'=>$sku_id])->field('id,sku_id,available_num')->find();
            if(!$ishave){
                return array_out(-1001, '查无数据');//后置错误 -1003
            }
            if($num){
                //存在num数量传参，则返回比较结果
                if($ishave['available_num'] >= $num){
                    //满足库存
                    return array_out(200, 'success','1');
                }else{
                    //超出库存
                    return array_out(200, 'success','2');
                }
            }else{
                //不存在num数量传参，则返回最大数量
                return array_out(200, 'success',$ishave);
            }
        }else{
            return array_out(-1001, '缺少参数');//后置错误 -1003
        }
    }

    //出库按钮请求操作
    public function outgoing()
    {
        //参数接收
        $params 		    = $this->getParams(1);//0 get 1 post
        $id = $params["id"] = isset($params["aid"]) ? $params["aid"] : '';//出库申请单id
        $user_id    	    = intval(isset($params["user_id"]) ? $params["user_id"] : 0);//操作用户ID

        //数据验证
        $Validate = validate('Allocation', 'validate');
        if( !$Validate -> scene('allocation_outgoing') -> check($params) ){
            json_out(-1001, $Validate -> getError(), []);//验证失败
        }
        //检查是否出货
        $res_isout = model('ErpAllocation') -> where(['id'=>$id,'all_status'=>'2'])->count();
        if($res_isout > 0){
            json_out(-1001, '出库申请已处理，请勿重复操作！');//验证失败
        }
        //逻辑处理
        $list = controller('Allocationlogic', 'logic') -> outGoing($user_id,$id);

        //数据返回
        if($list['code'] == 200){
            json_out($list['code'], $list['message'], $list['data']);
        }else{
            json_out($list['code'], $list['message'], []);
        }
    }



}